package cn.itsource.singleton.lazy;

/**
 *	单例模式：(23种设计模式)
 *		1. 概念：就是设计一个类，该类只能在外部创建一个对象。
 *
 *		2. 作用：
 *			1. 项目中的全局配置文件
 *			2. 项目中得全局日志文件（记录程序运行的一些流程）
 *			3. 不需要频繁创建对象的需求
 *			如： 回收站、资源管理器等
 *
 *		3. 场景：怎么选择使用哪种方式设计单例模式
 *			建议用饿汉模式，除非特殊情况才用懒汉模式，如果涉及到序列化（IO，将内存中的对象保存到硬盘的过程）操作，用枚举
 *
 *		4. 思路：
 *				创建对象 => new 类(); => new 是在调用类的构造方法  => 必须控制构造方法才能控制创建对象的数量
 *				控制在外边不能使用构造方法，才不能在外部随意创建对象 => 私有化构造方法 
 *				但是需要给外边提供一个对象 => 只能在当前类中创建好对象后，给外边返回(参考封装) =>
 *				提供一个getInstance()方法给外部返回对象 => 现在外边不能创建对象了，所有该	getInstance只能通过类名.getInstance()
 *				的方式调用，所有该getInstance方法是static修饰的			
 *
 * 				步骤：
 * 					1. 私有化构造方法
 * 					2. 提供一个getInstance()方法，将对象返回
 * 					3. 因为在外边没有对象，所有该getInstance()方法是通过类名.getInstance()调用
 * 
 * 		5. 实现方式：
 * 				1. 饿汉模式： 上来就干（优化方式：静态内部类）
 *					1. 优点：线程安全，获取对象时效率高，因为在类加载的时候就已经创建好对象，放静态区了
 *					2. 缺点：
 *						1. 占用资源
 *						2. 加载类时性能低
 *			
 *				2. 懒汉模式：（优化方式：双重校验锁）
 *						1. 优点：节省资源，类加载的时候效率高
 *						2. 缺点：线程不安全，获取对象效率低
 * 
 * 	懒汉模式：在需要的时候，才创建对象，即调用getInstance方法的时候需要（双重校验锁优化）
 */
public class Singleton {
	private Singleton() {
	}
	
	/**
	 * 因为final修饰类变量，必须是声明直接赋值，所以这里要去掉final
	 */
	private static Singleton SINGLETON;//常量一般全大写
	/**
	 * 在需要的时候，才创建对象，即调用getInstance方法的时候需要
	 * @return
	 */
	public static Singleton getInstance() {
		//判断是否已经被创建好了对象，如果创建好了对象，则直接返回即可
		if (SINGLETON == null) {
			SINGLETON = new Singleton();
		}
		return SINGLETON;
	}
}
